package pdamh.model.unidade;

import java.util.ArrayList;

import junit.framework.TestCase;
import pdamh.model.exceptions.PDAMHException;
import pdamh.model.util.Dimensao;

public class UnidadeOperacionalTest extends TestCase {

	protected void setUp() throws Exception {
		super.setUp();
	}

	public void testUnidadeOperacionalIntListOfSubUnidade() {
		UnidadeOperacional uni = new UnidadeOperacional(1);
		assertEquals("1", new ArrayList<SubUnidade>(), uni.getSubunidades());
		ArrayList<SubUnidade> subs = new ArrayList<SubUnidade>();
		UnidadeOperacional uni2 = new UnidadeOperacional(1, subs);
		assertEquals("2", uni2.getSubunidades(), subs);
	}

	public void testUnidadeOperacionalInt() {
		UnidadeOperacional uni = null;
		uni = new UnidadeOperacional(12);
		assertEquals("1", 12, uni.numero);
		uni = new UnidadeOperacional(-1);
		assertEquals("2", -1, uni.numero);
	}

	public void testGetNumero() {
		UnidadeOperacional uni = null;
		uni = new UnidadeOperacional(12);
		assertEquals("1", uni.numero, uni.getNumero());
		uni = new UnidadeOperacional(-1);
		assertEquals("2", -1, uni.getNumero());
	}

	public void testSetNumero() {
		UnidadeOperacional uni = null;
		uni = new UnidadeOperacional(12);
		uni.setNumero(0);
		assertEquals("1", 0, uni.getNumero());
		uni.setNumero(2);
		assertEquals("2", 2, uni.getNumero());
	}

	public void testGetArea() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
	}

	public void testSetArea() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
	}

	public void testGetVazao() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals(new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		assertEquals(new Dimensao(0.0010), uni.getVazao());
	}

	public void testSetVazao() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		uni.addSubunidade("i2", 1.0, 1.0, 1, 1, 1.0, 1.0);
		assertEquals("2", new Dimensao(0.0020), uni.getVazao());
	}

	public void testGetSubunidades() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		ArrayList<SubUnidade> sub = new ArrayList<SubUnidade>();
		SubUnidade sbnd = new SubUnidade(uni, "id", new Dimensao(1.0),
				new Dimensao(1.0), 1, 1, 1.0, 1.0);
		sub.add(sbnd);
		assertEquals("2", sub, uni.getSubunidades());

		UnidadeOperacional uni2 = new UnidadeOperacional(2000);
		assertEquals("3", new Dimensao(), uni2.getArea());
		uni2.addSubunidade("id2", 2.0, 2.0, 2, 2, 2.0, 2.0);
		ArrayList<SubUnidade> sub2 = new ArrayList<SubUnidade>();
		SubUnidade sbnd2 = new SubUnidade(uni2, "id2", new Dimensao(2.0),
				new Dimensao(2.0), 2, 2, 2.0, 2.0);
		sub2.add(sbnd2);
		assertEquals("4", sub2, uni2.getSubunidades());

	}

	public void testGetSubUnidade(String id) throws PDAMHException {

		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		uni.addSubunidade("id2", 2.0, 2.0, 2, 2, 2.0, 2.0);
		SubUnidade sbnd = uni.getSubUnidade(id);
		sbnd.setVazaoDaSu();
		sbnd.setArea();
		assertEquals("2", sbnd.getArea(), uni.getSubUnidade("id").getArea());
		sbnd.setNome("novoid");
		assertEquals("3", sbnd.getNome(), uni.getSubUnidade("novoid").getNome());
		uni.getSubUnidade("novoid");
		assertFalse(uni.getSubUnidade("novoid")
				.equals(uni.getSubUnidade("id2")));

	}

	public void testAddSubunidadeStringIntDoubleDoubleIntInt()
			throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		assertEquals("3", new Dimensao(0.0010), uni.getVazao());
		ArrayList<SubUnidade> sub = new ArrayList<SubUnidade>();
		SubUnidade sbnd = new SubUnidade(uni, "id", new Dimensao(1.0),
				new Dimensao(1.0), 1, 1, 1.0, 1.0);
		sub.add(sbnd);
		assertEquals("4", sub, uni.getSubunidades());
	}

	public void testRemoveSubunidade() throws PDAMHException {

		UnidadeOperacional uni = new UnidadeOperacional(1000);
		assertEquals("1", new Dimensao(), uni.getArea());
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		uni.removeSubUnidade("id");
		// assertTrue(uni.isEmpty());
		assertEquals("2", null, uni.getSubUnidade("id"));
		uni.addSubunidade("id2", 2.0, 2.0, 2, 2, 2.0, 2.0);
		SubUnidade sbnd2 = new SubUnidade(uni, "id2", new Dimensao(2.0),
				new Dimensao(2.0), 2, 2, 2.0, 2.0);
		assertEquals("2", sbnd2, uni.removeSubUnidade("id2"));

	}

	public void testEqualsObject() throws PDAMHException {
		UnidadeOperacional uni = new UnidadeOperacional(1000);
		uni.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		UnidadeOperacional uni2 = new UnidadeOperacional(1000);
		uni2.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		assertTrue(uni.equals(uni2));
		UnidadeOperacional uni3 = new UnidadeOperacional(9999);
		uni3.addSubunidade("id", 1.0, 1.0, 1, 1, 1.0, 1.0);
		assertFalse(uni2.equals(uni3));
		assertTrue(uni2.equals(uni));

	}

}
